package com.game.Maze.GUI;

import com.game.Maze.Utils.IActionExecutor;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;

public abstract class BaseActivity extends Activity implements IActionExecutor
{
  /** Вызывается при первом создании Activity */
  @Override
  public void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);

    if (beforeSetContentView(savedInstanceState))
    {
      int idLayout = getLayoutId();

      if (idLayout > 0)
        setContentView(idLayout);
    }

    // Вызываем метод который выполняет действия необходимые при создании
    // Activity
    afterSetContentView(savedInstanceState);
  }

  /**
   * Вызывается до установки отображаемого содержимого. Может использоваться для установки нестандартного отображения Activity.
   * 
   * @param savedInstanceState состояние приложения
   * @return возвращает истину, если содержимое Activity должно браться из ресурсов или ложь если содержимое Activity уже
   *         устанвлено
   */
  protected boolean beforeSetContentView(Bundle savedInstanceState)
  {
    // Используется в потомках
    return true;
  }

  /**
   * Вызывается после установки отображаемого содержимого
   * 
   * @param savedInstanceState состояние приложения
   */
  protected void afterSetContentView(Bundle savedInstanceState)
  {
    // Используется в потомках
  }

  /**
   * Вызывается когда выбирается пункт в меню
   * 
   * @param selectedItem выбранный пункт меню
   * @return true
   */
  @Override
  public boolean onOptionsItemSelected(MenuItem selectedItem)
  {
    if (!doExecuteAction(selectedItem.getItemId()))
      return super.onOptionsItemSelected(selectedItem);

    return true;
  }

  /**
   * Вызывается при когда Activity пытается создать меню
   * 
   * @param menu меню к которому будут добавлятся пункты
   * @return true
   */
  @Override
  public boolean onCreateOptionsMenu(Menu menu)
  {
    super.onCreateOptionsMenu(menu);

    int idMenu = getMenuId();

    if (idMenu > 0)
    {
      // Заружаем меню из ресурсов и устанавливаем его в качестве основного
      MenuInflater menuInflater = getMenuInflater();
      menuInflater.inflate(idMenu, menu);
    }

    return true;
  }

  /**
   * Устанавливает Home в качестве текущей Activity Аналогично нажатию кнопки с домиком (Home), приложение при этом сворачивается,
   * но не закрывается
   */
  protected void setHomeActivity()
  {
    Intent intent = new Intent(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_HOME);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
  }

  /**
   * Вызывается для обработки указанного в идентификаторе действия Должен быть реализован в потомках.
   * 
   * @param idAction идентификатор действия
   * @return true если действие было обработано
   */
  public abstract boolean doExecuteAction(int idAction);

  /**
   * Возвращает идентификатор ресурса, содержащего XML с разметкой страницы
   * 
   * @return идентификатор ресурса
   */
  protected int getLayoutId()
  {
    return 0;
  }

  /**
   * Возвращает идентификатор ресурса, содержащего XML с меню
   * 
   * @return идентификатор ресурса
   */
  protected int getMenuId()
  {
    return 0;
  }
}
